/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IElementoDAO;
import desarrollosoft.ghce.entidades.Elemento;
import desarrollosoft.ghce.entidades.Gravedad;
import desarrollosoft.ghce.entidades.Paciente;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;

/**
 *
 * @author ariel
 */
@Repository("elementoDAO")
public class ElementoDAO implements IElementoDAO {

    @PersistenceContext
    EntityManager entityManager;
    
    @Override
    public List<Elemento> buscarElementos(Paciente pacienteElegido, String descripcion, Gravedad gravedad) {
        Query query;
        
        if (descripcion.equals("") && gravedad == null) { // si las 2 vienen vacias, traigo todos
            query = entityManager.createQuery("SELECT e FROM Elemento e WHERE e.paciente = :paciente "
                    + "ORDER BY e.fecha DESC");
            query.setParameter("paciente", pacienteElegido);
        } else if (!descripcion.equals("") && gravedad == null) { // si solo vino descripcion traigo las que coinciden con descripcion
            query = entityManager.createQuery("SELECT e FROM Elemento e WHERE e.paciente = :paciente "
            + "ORDER BY e.fecha DESC");
            query.setParameter("paciente", pacienteElegido);
            /* filtro por software las que coinciden con la descripcion */
            List<Elemento> listaOriginal = query.getResultList();
            return obtenerElementosConDescripcion(listaOriginal, descripcion);
        } else if (descripcion.equals("") && gravedad != null) { // si solo vino gravedad, traigo todos los que tengan esa gravedad
            query = entityManager.createQuery("SELECT e FROM Elemento e WHERE e.paciente = :paciente "
                    + "AND e.gravedad = :gravedad ORDER BY e.fecha DESC");
            query.setParameter("paciente", pacienteElegido);
            query.setParameter("gravedad", gravedad);
        } else { // sino vinieron las 2, por tanto hago traigo los que coincidan con las 2
            query = entityManager.createQuery("SELECT e FROM Elemento e WHERE e.paciente = :paciente "
                    + "AND e.gravedad = :gravedad ORDER BY e.fecha DESC");
            query.setParameter("paciente", pacienteElegido);
            query.setParameter("gravedad", gravedad);
            /* filtro por software las que coinciden con la descripcion */
            List<Elemento> listaOriginal = query.getResultList();
            return obtenerElementosConDescripcion(listaOriginal, descripcion);
        }
        return query.getResultList();
    }
    
    /**
     * Filtra la lista solo devolviendo los elementos cuya descripcion contenga a la descripcion que recibio
     * @param listaOriginal
     * @param descripcion
     * @return 
     */
    private List<Elemento> obtenerElementosConDescripcion(List<Elemento> listaOriginal, String descripcion) {
        List<Elemento> listaDevolucion = new ArrayList<>();
        String descripcionMayusculas = descripcion.toUpperCase();
        String elementoDescripcionMayusculas;
        
        for (Elemento elemento: listaOriginal) {
            elementoDescripcionMayusculas = elemento.getDescripcion().toUpperCase();
            if (elementoDescripcionMayusculas.contains(descripcionMayusculas)) {
                listaDevolucion.add(elemento);
            }
        }
        
        return listaDevolucion;
    }

    @Override
    public Elemento obtenerElementoConAnioMinimo() {
        Query consulta = entityManager.createQuery(
                "SELECT e FROM Elemento e WHERE e.fecha = (SELECT MIN(e.fecha) FROM Elemento e)"
        );
        List<Elemento> lista = consulta.getResultList();
        return lista.get(0);
    }
    
}
